package com.atguigu.gmall.pms.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.gmall.pms.vo.ItemSaleAttrValuesVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SkuAttrValueMapper;
import com.atguigu.gmall.pms.entity.SkuAttrValueEntity;
import com.atguigu.gmall.pms.service.SkuAttrValueService;


@Service("skuAttrValueService")
public class SkuAttrValueServiceImpl extends ServiceImpl<SkuAttrValueMapper, SkuAttrValueEntity> implements SkuAttrValueService {

    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SkuAttrValueEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SkuAttrValueEntity>()
        );

        return new PageResultVo(page);
    }

    @Override
    public List<SkuAttrValueEntity> querySkuAttrValuesBySkuId(Long skuId) {

        return baseMapper.querySkuAttrValuesBySkuId(skuId);
    }

    @Override
    public List<ItemSaleAttrValuesVo> queryItemSkuAttrValuesBySpuId(Long spuId) {
        //自定义sql来实现：
        // spuid:  使用sku表 根据spuid查询它所有的sku的id集合，使用skuid联查sku_attr_value
        // [{attrId: 3 ,attrName:'机身颜色' , attrValues:['黑色' , '白色'] }]   sku_attr_value表中的数据
        List<SkuAttrValueEntity>  skuAttrValueEntities =  baseMapper.querySkuAttrValuesBySpuId(spuId);
        //将查询到的结果集转为 List<ItemSaleAttrValueVo>
        /*
            private Long attrId;
            private String attrName;
            private Set<String> attrValues;

            多个SkuAttrValueEntity 只要attrId相同，就合并转为一个ItemSaleAttrValueVo对象
         */
        //skuAttrValueEntities 使用 每个对象的attrId分组， 分组之后 每组的attrId 和attrName 都相同， attrValue使用set来存储
        //Collectors.groupingBy(SkuAttrValueEntity::getAttrId): 对skuAttrValueEntities中的所有的对象 使用 SkuAttrValueEntity::getAttrId进行分组
        // attrId相同的分到一组 使用List保存，attrId作为key
        Map<Long, List<SkuAttrValueEntity>> map = skuAttrValueEntities.stream()
                .collect(Collectors.groupingBy(SkuAttrValueEntity::getAttrId));
        List<ItemSaleAttrValuesVo> itemSaleAttrValuesVos = new ArrayList<>();
        //将分组之后的map转为 ItemSaleAttrValueVo对象：map中每一个映射对应一个ItemSaleAttrValueVo对象
        map.forEach((attrId,skuAttrValues)->{
            ItemSaleAttrValuesVo i = new ItemSaleAttrValuesVo();
            i.setAttrId(attrId);
            i.setAttrName(skuAttrValues.get(0).getAttrName());
            Set<String> set = skuAttrValues.stream().map(SkuAttrValueEntity::getAttrValue).collect(Collectors.toSet());
            i.setAttrValues(set);
            itemSaleAttrValuesVos.add(i);
        });
        return itemSaleAttrValuesVos;
    }

    @Override
    public Map<Long, String> queryItemSkuAttrValueBySkuId(Long skuId) {
        //使用skuid查询所有的 skuAttrValue对象
        List<SkuAttrValueEntity> skuAttrValueEntities = this.list(new LambdaQueryWrapper<SkuAttrValueEntity>()
                .eq(SkuAttrValueEntity::getSkuId, skuId));
        // { 3:'黑色'}
        Map<Long, String> map = skuAttrValueEntities.stream()
                .collect(Collectors.toMap(SkuAttrValueEntity::getAttrId, SkuAttrValueEntity::getAttrValue));
        return map;
    }

    @Override
    public String queryItemSaleJsonsBySpuId(Long spuId) {

        //sku和sku_attr_value表联查
        /*
            map1.put("sku_id" ,1)   map1.put("attr_values" , "黑色,8G,128G")
            map2.put("sku_id" ,2)   map2.put("attr_values" , "白色,8G,128G")

            list.add(map1)
            list.add(map2)
         */
        List<Map<String,Object>>  list =  baseMapper.queryItemSaleJsonsMapBySpuId(spuId);
        Map<Object,Object> jsonMap = new HashMap<>();
        list.forEach(map->{
            Object attrId = map.get("sku_id");
            Object attrValues = map.get("attr_values");
//            {'白色,8G,128G': 1 , '白色,8G,256G':2 }
            jsonMap.put(attrValues,attrId.toString());
        });
        //将map转为json字符串
        return JSON.toJSONString(jsonMap);
    }

}